目標:從零建立一個 1 控制節點(control plane)+ 1 台 GPU 工作節點(worker) 的最小可用叢集,為之後的 CNI(Day 3)與 GPU Operator(Day 4)鋪路。
節點與主機名(可自行替換):
cp1
192.168.27.10gpu01
192.168.27.11(8× NVIDIA GPU)內部網段:192.168.27.0/24
叢集 CIDR(kubeadm 預設 ServiceCIDR 保持不動):
10.244.0.0/16
(Day 3 會裝 Cilium,這個範圍相容)10.96.0.0/12
提醒:若你已規劃了不同的內網與 CIDR,本文中的參數請相應替換。
下列指令以 Ubuntu 22.04/24.04 與 Rocky/Alma 9 為例,兩類系統擇一執行。
通用(Ubuntu / RHEL 系):
# 建議設時區,便於排錯
sudo timedatectl set-timezone Asia/Taipei
# 關閉 swap(K8s 要求)
sudo swapoff -a
sudo sed -i '/\sswap\s/d' /etc/fstab
# 載入必要模組
echo -e 'overlay\nbr_netfilter' | sudo tee /etc/modules-load.d/containerd.conf
sudo modprobe overlay && sudo modprobe br_netfilter
# K8s 需要的 sysctl
cat <<'EOF' | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
# 設主機名(請依實機分別在 cp1 / gpu01 上執行)
# 例:在控制平面
# sudo hostnamectl set-hostname cp1
# 在工作節點
# sudo hostnamectl set-hostname gpu01
# /etc/hosts(兩台都加對方):
# 192.168.27.10 cp1
# 192.168.27.11 gpu01
Ubuntu:
sudo apt-get update
sudo apt-get install -y containerd
# 生成並調整預設設定(啟用 systemd cgroup)
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl enable --now containerd
Rocky/Alma 9:
sudo dnf install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl enable --now containerd
之後我們會用 GPU Operator 來處理 GPU Runtime 與 Driver(Day 4)。若你要先自驗實體 GPU 狀態,可以暫時在
gpu01
安裝 NVIDIA 驅動,並確認nvidia-smi
可正常列出 8 張卡。
控制平面 cp1
需入站放行:6443/tcp
、10250/tcp
、10257/tcp
、10259/tcp
。
工作節點 gpu01
需入站放行:10250/tcp
。
範例:
Ubuntu(UFW):
# cp1
sudo ufw allow 6443/tcp && sudo ufw allow 10250/tcp && \
sudo ufw allow 10257/tcp && sudo ufw allow 10259/tcp
# gpu01
sudo ufw allow 10250/tcp
Rocky/Alma(firewalld):
# cp1
sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=10257/tcp
sudo firewall-cmd --permanent --add-port=10259/tcp
sudo firewall-cmd --reload
# gpu01
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --reload
叢集內部 Pod/Node 之間通訊會在 Day 3 安裝 CNI 後啟用;此處先確保控制面的必要連線無阻。
本文以 Kubernetes v1.34 的
pkgs.k8s.io
社群套件庫為例,其他小版號請替換 URL 中的版本字串。
Ubuntu:
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl gpg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | \
sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /' | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable --now kubelet
Rocky/Alma 9:
sudo tee /etc/yum.repos.d/kubernetes.repo > /dev/null <<'EOF'
[kubernetes]
name=Kubernetes v1.34
baseurl=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/repodata/repomd.xml.key
EOF
sudo dnf install -y kubelet kubeadm kubectl
sudo systemctl enable --now kubelet
cp1
)sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16
初始化成功後,畫面會輸出一段 kubeadm join ...
指令(含 token 與 CA 資訊)。請複製保存,待會要到 gpu01
上加入叢集。
設定 kubectl:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 驗證(此時因尚未裝 CNI,Node 會是 NotReady 屬正常)
kubectl get nodes -o wide
kubectl get pods -A
若你之後會遠端操作,也可以把
$HOME/.kube/config
複製到你的工作站。
gpu01
)在 gpu01
上執行從 cp1
複製來的 join 指令,例如:
sudo kubeadm join 192.168.27.10:6443 \
--token <your-token> \
--discovery-token-ca-cert-hash sha256:<your-hash>
回到 cp1
檢查:
kubectl get nodes -o wide
出現
cp1
與gpu01
兩台節點即表示完成基本骨架。Node 仍可能顯示 NotReady(因為 CNI 尚未部署),這會在 Day 3 裝 Cilium 後轉為 Ready。
Day 4 會透過 NVIDIA GPU Operator 部署驅動與 Container Toolkit;若你想先確認實體 GPU 狀態,可在 gpu01
上:
# 實體層檢查(需已安裝 NVIDIA 驅動)
nvidia-smi
# 溫度、風扇、ECC(若支援)等可一併確認
nvidia-smi -q | less
若你的環境 必須 由 GPU Operator 安裝驅動(不想預先裝 Driver),請先確保 BIOS 關閉 Secure Boot,並讓節點具備 kernel headers 與必要建置工具;這些會在 Day 4 詳述。
kubeadm init
卡在 preflight:確認 swapoff
、br_netfilter
與 ip_forward=1
已生效。
Worker 加入時憑證錯誤:重新在控制面產生 token:
kubeadm token create --print-join-command
防火牆封鎖:確定控制面/工作節點必要連接埠已放行;另外,CNI 安裝後還需要節點間 L3 連通(Day 3 會處理)。
節點長期 NotReady:CNI 尚未安裝或未正常啟動;等 Day 3。
你已完成:
kubeadm init
建立控制平面,並以 kubeadm join
納入 八 GPU 的 gpu01
。最後までご視聴ありがとうございました